&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	ТипОбъекта=Параметры.ТипОбъекта;
	ОбрабатыватьТабличныеЧасти=Параметры.ОбрабатыватьТабличныеЧасти;
	СписокВыбранных=Параметры.СписокВыбранных;

	Дерево=ДанныеФормыВЗначение(ДеревоТаблиц, Тип("ДеревоЗначений"));

	Дерево.Строки.Очистить();

	МетаданныеОбъектов = Метаданные[?(ТипОбъекта = 1, "Документы", "Справочники")];
//	ИмяТипаОбъекта = ?(ТипОбъекта = 1,"Документ","Справочник");
	Если ОбрабатыватьТабличныеЧасти Тогда
		Заголовок = "Отбор по табличным частям " + ?(ТипОбъекта = 1, "документов", "справочников");
	Иначе
		Заголовок = "Отбор по " + ?(ТипОбъекта = 1, "документам", "справочникам");
	КонецЕсли;
	Для Каждого Метаданное Из МетаданныеОбъектов Цикл

		Если ОбрабатыватьТабличныеЧасти И Метаданное.ТабличныеЧасти.Количество() = 0 Тогда

			Продолжить;

		КонецЕсли;
		Строка                      = Дерево.Строки.Добавить();
		ИмяМетаданного              = Метаданное.Имя;
		Строка.ИмяТаблицы           = ИмяМетаданного;
		Строка.ПредставлениеТаблицы = Метаданное.Представление();

		Если Не ОбрабатыватьТабличныеЧасти Тогда

			Если Не СписокВыбранных.НайтиПоЗначению(ИмяМетаданного) = Неопределено Тогда

				Строка.Пометка = Истина;

			КонецЕсли;

		Иначе
			ПометкаРодителя = Неопределено;
			Для Каждого ТабличнаяЧасть Из Метаданное.ТабличныеЧасти Цикл

				СтрокаТЧ                      = Строка.Строки.Добавить();
				ИмяТаблицы                    = ТабличнаяЧасть.Имя;
				СтрокаТЧ.ИмяТаблицы           = ИмяМетаданного + "." + ИмяТаблицы;
				СтрокаТЧ.ПредставлениеТаблицы = ТабличнаяЧасть.Представление();

				Если Не СписокВыбранных.НайтиПоЗначению(ИмяМетаданного + "." + ИмяТаблицы) = Неопределено Тогда

					СтрокаТЧ.Пометка = Истина;

				КонецЕсли;

				Если ПометкаРодителя = Неопределено Тогда
					ПометкаРодителя = СтрокаТЧ.Пометка;
				ИначеЕсли Не ПометкаРодителя = 2 И ПометкаРодителя <> СтрокаТЧ.Пометка Тогда
					ПометкаРодителя = 2;
				КонецЕсли;

			КонецЦикла;
			Строка.Пометка = ПометкаРодителя;
		КонецЕсли;
	КонецЦикла;

	ЗначениеВДанныеФормы(Дерево, ДеревоТаблиц);
КонецПроцедуры
&НаКлиенте
Процедура ДеревоТаблицПометкаПриИзменении(Элемент)
	ТекущиеДанные = Элементы.ДеревоТаблиц.ТекущиеДанные;

	Если ТекущиеДанные.Пометка = 2 Тогда
		ТекущиеДанные.Пометка = 0;
	КонецЕсли;

	Если ТекущиеДанные.ПолучитьРодителя() <> Неопределено Тогда
		ПометкаРодителя = ТекущиеДанные.Пометка;
		Для Каждого Строка Из ТекущиеДанные.ПолучитьРодителя().ПолучитьЭлементы() Цикл
			Если Строка.Пометка <> ПометкаРодителя Тогда
				ПометкаРодителя = 2;
				Прервать;
			КонецЕсли;
		КонецЦикла;
		ТекущиеДанные.ПолучитьРодителя().Пометка = ПометкаРодителя;
	Иначе
		Для Каждого Строка Из ТекущиеДанные.ПолучитьЭлементы() Цикл
			Строка.Пометка = ТекущиеДанные.Пометка;
		КонецЦикла;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура Выбрать(Команда)
//	ИмяТипаОбъекта = ?(ТипОбъекта = 1,"Документ","Справочник");
	СписокВыбранных.Очистить();
	Для Каждого Строка Из ДеревоТаблиц.ПолучитьЭлементы() Цикл
		Если Не ОбрабатыватьТабличныеЧасти Тогда

			Если Строка.Пометка Тогда
				СписокВыбранных.Добавить(Строка.ИмяТаблицы, Строка.ПредставлениеТаблицы);
			КонецЕсли
			;

		Иначе

			Для Каждого СтрокаТаблицы Из Строка.ПолучитьЭлементы() Цикл

				Если СтрокаТаблицы.Пометка Тогда
					СписокВыбранных.Добавить(СтрокаТаблицы.ИмяТаблицы, Строка.ПредставлениеТаблицы + " [ ТЧ : "
						+ СтрокаТаблицы.ПредставлениеТаблицы + " ] ");
				КонецЕсли
				;

			КонецЦикла;
		КонецЕсли;

	КонецЦикла;
	Закрыть(СписокВыбранных);
КонецПроцедуры

&НаКлиенте
Процедура УстановитьПометкуНаВсеСтроки(НоваяПометка)
	Для Каждого Строка Из ДеревоТаблиц.ПолучитьЭлементы() Цикл
		Строка.Пометка=НоваяПометка;
		Если ОбрабатыватьТабличныеЧасти Тогда
			Для Каждого СтрокаТаблицы Из Строка.ПолучитьЭлементы() Цикл
				СтрокаТаблицы.Пометка=НоваяПометка;
			КонецЦикла;
		КонецЕсли;

	КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура УстановитьПометки(Команда)
	УстановитьПометкуНаВсеСтроки(1);
КонецПроцедуры

&НаКлиенте
Процедура СнятьПометки(Команда)
	УстановитьПометкуНаВсеСтроки(0);
КонецПроцедуры